package hr.fer.zpr.nmbp.project1.dao;

import hr.fer.zpr.nmbp.project1.dao.exceptions.PrimaryKeyConstraintException;
import hr.fer.zpr.nmbp.project1.model.Lijecnik;
import hr.fer.zpr.nmbp.project1.model.Pacijent;

import java.util.List;

import com.db4o.ObjectContainer;
import com.db4o.constraints.UniqueFieldValueConstraintViolationException;

public class PacijentDAO {

	private ObjectContainer db;
	
	public PacijentDAO(ObjectContainer db) {
		this.db = db;
	}

	public void save(Pacijent pacijent) {
		if(pacijent.getMbo() == null || pacijent.getMbo().isEmpty()){
			throw new PrimaryKeyConstraintException("MBO pacijenta ne smije biti NULL");
		}
		
		this.db.store(pacijent);
		
		try{
			this.db.commit();
		}catch(UniqueFieldValueConstraintViolationException e){
			this.db.rollback();
			e.printStackTrace();
			throw new PrimaryKeyConstraintException("MBO pacijenta već postoji u bazi podataka");
		}
	}

	public void delete(Pacijent pacijent) {		
		LijecnikDAO lijecnikDAO = DAOFactory.getLijecnikDAO();
		List<Lijecnik> lijecnici = lijecnikDAO.loadAll();
		
		for (Lijecnik  lijecnik : lijecnici) {			
			List<Pacijent> pacijentiLijecnika = lijecnik.getPacijenti();
			pacijentiLijecnika.remove(pacijent);
			lijecnikDAO.save(lijecnik);
		}
		
		this.db.delete(pacijent);
		this.db.commit();
	}

	public List<Pacijent> load(Pacijent pacijentPrototype) {
		return this.db.queryByExample(pacijentPrototype);		
	}

	public List<Pacijent> loadAll() {
		return this.db.query(Pacijent.class);
	}
}
